package com.dji.ux.sample.TCPClient;

import android.util.Log;

import java.sql.Time;
import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class PLCCommand {
    public static byte[] get_plcdata = {0x50,0x00,//5000是3E帧识别帧头，4E帧是5400
            0x00,//网路编号，上位访问下位，固定00；
            (byte) 0xff,//PLC编号，上位访问下位，固定FF;
            (byte) 0xff,0x03,//请求目标模块IO编号，值要从小到大看，也就是反过来看，三菱所有的协值都是这样，所以这里是03FF,十进制是1023； 也是固定的；
            0x00,//请求目标模块站编号，上位访问下位，固定00;
            0x0c,0x00,//命令内容的长度，从这两个字节之后的数据的字节数
            0x10,0x00,//表示等待PLC响应的timeout时间；这里 值是0010，十进制是16 ；相当与最大等待时间250ms*16=4秒；实际上PLC一般2,3个毫秒内就响应了；
            0x01,0x04,//主命令，值是0401(所有值都要反过来看，)；表示批量读取；如果是1401就是随机读取；
            0x00,0x00,//子命令，值是0表示按字读取(1个字=16位),如果值是1就按位读取；
            (byte) 0x3c,0x00,0x00,//地址因为跨度比较大，所以用了3个字节；这里的值是000064，十进制就是100
            (byte) 0xa8,//表示读取PLC寄存器的类型： 这里的A8表示D点；其他常见的有： 90-M点；9C-X点；9D-Y点；B0-ZR外部存储卡
            (byte) 0x02,0x00};//读取长度，值是0014，十进制就是20；

    public static byte[] get_weather = {
            0x50,0x00,//5000是3E帧识别帧头，4E帧是5400
            0x00,//网路编号，上位访问下位，固定00；
            (byte) 0xff,//PLC编号，上位访问下位，固定FF;
            (byte) 0xff,0x03,//请求目标模块IO编号，值要从小到大看，也就是反过来看，三菱所有的协值都是这样，所以这里是03FF,十进制是1023； 也是固定的；
            0x00,//请求目标模块站编号，上位访问下位，固定00;
            0x0c,0x00,//命令内容的长度，从这两个字节之后的数据的字节数
            0x10,0x00,//表示等待PLC响应的timeout时间；这里 值是0010，十进制是16 ；相当与最大等待时间250ms*16=4秒；实际上PLC一般2,3个毫秒内就响应了；
            0x01,0x04,//主命令，值是0401(所有值都要反过来看，)；表示批量读取；如果是1401就是随机读取；
            0x00,0x00,//子命令，值是0表示按字读取(1个字=16位),如果值是1就按位读取；
            (byte)0xFE,0x01,0x00,//地址因为跨度比较大，所以用了3个字节；这里的值是000064，十进制就是100
            (byte) 0xa8,//表示读取PLC寄存器的类型： 这里的A8表示D点；其他常见的有： 90-M点；9C-X点；9D-Y点；B0-ZR外部存储卡
            (byte) 0x35,0x00};//读取长度，值是0014，十进制就是2；

    private int heartTick;
    private boolean isAlwaysHeart1;
    private boolean isD50_9;
    private boolean isD50_8;
    private byte[] nowCommand;
    public static byte[] plc_heart =        {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, 0x00,0x00};
    public static byte[] ready_landing =    {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, 0x02,0x00};
    public static byte[] change_battery =   {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, 0x04,0x00};
    public static byte[] ready_takeOff =    {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, 0x08,0x00};
    public static byte[] close_door =       {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, 0x10,0x00};
    public static byte[] after_landing =    {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, 0x20,0x00};
    public static byte[] after_takeOff =    {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, 0x40,0x00};
    public static byte[] plc_reset =        {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, (byte)0x80,0x00};
    public static byte[] drone_power =      {0x50,0x00,0x00,(byte) 0xff,(byte) 0xff,0x03,0x00,  0x0e,0x00,  0x10,0x00,  0x01,0x14, 0x00,0x00,  0x32,0x00,0x00,  (byte) 0xa8,  0x01, 0x00, 0x00,0x02};

    public PLCCommand() {
        this.heartTick = 1;
        this.nowCommand = plc_heart;
        this.isAlwaysHeart1 = false;
        this.isD50_8 = true;
    }

    public void setD50_9(boolean d50_9) {
        isD50_9 = d50_9;
    }

    public void setD50_8(boolean d50_8) {
        isD50_8 = d50_8;
    }

    public byte[] nextTickCommand(){
        byte[] tempCommand = this.nowCommand.clone();
        if (heartTick == 1){
            tempCommand[21] += 0x01;
            heartTick = 0;

        } else {
            heartTick = 1;
        };
        if (isD50_8){
            tempCommand[22] += 0x01;
        }
        if (isD50_9) {
            tempCommand[22] += 0x02;
        }
        return tempCommand;
    }

    public void setNowCommand(final byte[] nowCommand) {
        resetCommand();
        heartTick = 1;
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                PLCCommand.this.nowCommand = nowCommand;
            }
        }, 1000);
        heartTick = 1;
    }

    private void resetCommand(){
        this.nowCommand = plc_heart;
    }
}
